package com.example.demo.mqserver.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 张
 * Date: 2024-07-10
 * Time: 19:28
 */
//表示一个交换机
@Data
public class Exchange {
    //使用name来作为交换机的身份标识
    private String name;
    //交换机类型DIRECT,FANOUT,TOPIC
    private ExchangeType type = ExchangeType.DIRECT;
    //durable 表示该交换机是否要进行持久化 是为ture
    private boolean durable = false;
    //如果当前交换机没人使用,自动删除   目前先实现伪删除
    private boolean autoDelete = false;
    // arguments 表示创建交换机时 指定的一些额外选项  跟autDelete一样RabbitMQ有,但是先不实现
    // 此处为了把arguments存储到数据库中,就要把数据(map)进行序列化(json)
    private Map<String,Object> arguments = new HashMap<>();

    //这组get 和 set Arguments是为了方便数据库使用的  -----  数据库特供
    public String getArguments() {
        //把当前的argument通过json转换成String
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(arguments);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return "{}";//如果代码出现异常
    }

    //从数据库读数据的之后,构造Exchange对象
    public void setArguments(String argumentsJson) {
        //把参数中的argumentsJson按照json格式解析
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            this.arguments = objectMapper.readValue(argumentsJson, new TypeReference<HashMap<String,Object>>() {});//通过TypeReference这个方法来描述当前的的数据要转换成啥样的对象
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    //针对Arguments在额外提供一组setter getter方法给服务器使用  ---- java代码内部使用
    public Object getArguments(String key) {
        return arguments.get(key);
    }

    public void setArguments(String key,Object value) {
        arguments.put(key,value);
    }

    public void setArguments(Map<String,Object> arguments) {
        this.arguments = arguments;
    }



}
